package com.lmy.springboot.config;

import com.lmy.springboot.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 使用@Configuration(proxyBeanMethods = false) 表示WebConfig是一个配置类
 * 同时使用了Lite模式，即每次@Bean方法返回的组件都是新创建的，是非代理模式
 * proxyBeanMethods 是在调用@Bean 方法才生效，不能直接通过容器获取bean
 */
@Configuration(proxyBeanMethods = false)
public class WebConfig {

    @Bean
    //注入Bean WebMvcConfiguration
    public WebMvcConfigurer webMvcConfigurer() {
        //返回一个匿名对象，重写了addFormatters方法
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                /*
                    1.在addFormatters()中，增加一个自定义转换器
                    2.增加自定义转换器 String -> Car
                    3.增加的自定义转换器会注册到 converts 容器中
                    4.converters 底层结构是ConcurrentHashMap 内置有124个转换器
                    5.key:源类型->目标类型 value:转换器实例
                 */
                //传入一个匿名内部类并实现了convert方法
                registry.addConverter(new Converter<String, Car>() {
                    @Override
                    public Car convert(String source) { //source就是传入的字符串 碧水金睛兽
                        //这里就加入自定义转换逻辑
                        if (!ObjectUtils.isEmpty(source)) {
                            Car car = new Car();
                            String[] strArr = source.split(",");
                            car.setName(strArr[0]);
                            car.setPrice(Double.parseDouble(strArr[1]));
                            return car;
                        }
                        return null;
                    }
                });
            }
        };
    }

}
